﻿using DBO_ShopMob;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WP_Customer_ShopMob.Helper;

namespace WP_Customer_ShopMob.Model
{
    /// <summary>
    /// Déleguée traitant le resultat d'une requête faite à la source de données
    /// </summary>
    /// <param name="result">Resultat sous format string d'une requete à la source de données</param>
    /// <param name="exception">null sauf s'il y a une erreur lors de la requete à la source de données</param>
    public delegate void ResultHandler(string result, Exception exception);

    /// <summary>
    /// Interface representant les différentes requête qui peuvent être envoyée à la source de données
    /// </summary>
    interface IRepository
    {
        /// <summary>
        /// Méthode permetant d'identifier un utilisateur via son login/mot de passe
        /// </summary>
        /// <param name="login">identifiant de l'utilisateur</param>
        /// <param name="motdePasse">mot de passe de l'utilisateur</param>
        /// <param name="methodToExec">méthode à executer pour traiter le resultat de la requête</param>
        /// <remarks>Pour une sécurité efficace, il faudrait cripter le mot de passe</remarks>
        void Connexion(string login, string motdePasse, ResultHandler methodToExec);
        
        /// <summary>
        /// Méthode permettant d'inscrire un nouvel utilisateur
        /// </summary>
        /// <param name="client">Information du client voir -> DBO_ShopMob.Client</param>
        /// <param name="methodToExec">méthode à executer pour traiter le resultat de la requête</param>
        void AjouterClient(Client client, ResultHandler methodToExec);

        /// <summary>
        /// Méthode permettant d'obtenir les informations du client via son identifiant
        /// </summary>
        /// <param name="login">identifiant de l'utilisateur</param>
        /// <param name="methodToExec">méthode à executer pour traiter le resultat de la requête</param>
        void GetClientParID(string login, ResultHandler methodToExec);

        /// <summary>
        /// Méthode permettant d'obtenir les catégorie parent
        /// </summary>
        /// <param name="methodToExec">méthode à executer pour traiter le resultat de la requête</param>
        void GetCategoriesMere(ResultHandler methodToExec);

        /// <summary>
        /// Méthode permettant de récupère les catégories filles à partir de l'id de la catégorie mere
        /// </summary>
        /// <param name="id">id de la catégorie</param>
        /// <param name="methodeToExec">méthode à executer pour traiter le resultat de la requête</param>
        void GetCategoriesFille(long id, ResultHandler methodeToExec);

        /// <summary>
        /// Méthode permettant de recupère les articles d'une categorie
        /// </summary>
        /// <param name="id">id de la catégorie mere</param>
        /// <param name="methodeToExec">méthode à executer pour traiter le resultat de la requête</param>
        void GetArticlesByCateg(long id, ResultHandler methodeToExec);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="methodToExec"></param>
        void GetMagasinForArticle(long id, ResultHandler methodToExec);

        void GetArticlesByNom(string nom, ResultHandler methodToExec);

        /// <summary>
        /// Méthode permettant de récupérer les articles selon leur id (QR Code)
        /// </summary>
        /// <param name="id">id de l'article</param>
        /// <param name="methodToExec">méthode à exécuter pour traiter le resultat de la requête</param>
        void GetArticlesById(long id, ResultHandler methodToExec);
    }
}
